<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script>
/* 
1. typeof 能判断哪些类型
2. 什么时候使用=== 什么时候使用==
3. 值类型和应用类型 
*/

//  值类型
let a = 100;
let b = a;
a = 200;
console.log(b); //100

let c = {age:20};
let d = c;
c.age = 21;
console.log(d.age); //21

// 常见的值类型
let e ; //  undefined;
let f = 'abc'; //string
let g = 100;
let h = true;
let i = Symbol("i");

// 常见的引用类型
let obj = {age:100};
let arr = ["a","b","c"];
let n = null; //特殊引用类型指向空指针
function fn () {};// 特殊引用类型,不能存储数据，没有拷贝和赋值函数这一说

// typeof 运算符
typeof e;   //  undefined;
typeof f;   //  string
typeof g;   //  number
typeof h;   //  boolean
typeof i;   //  symbol
typeof console.log // funtion
typeof fn // function

//  能势必引用类型（所有的引用类型返回都是object）
typeof obj;     //  object
typeof null;    //  object
typeof arr;     //  object
typeof fn;      //  object

//  深拷贝
const obj1 = {
    name:"mumu",
    age:18,
    address:{
        provice:"hn",
        city:"zhengzhou",
    },
    arr:["a","b","c"]
} 

/* 
const obj2 = obj1;
obj2.address.city = "anyang";
console.log(ob2.address.city) //anyang 
*/
/**
* 深拷贝
* @param {Object} obj 要拷贝的对象
*/

function deepClone(obj={}){
    if(typeof obj !== 'object'|| obj == null){
        return obj;
        // 值类型直接返回
    }
    // 初始化返回结果
    let result;
    if(obj instanceof Array){
        result  = [];
    }else{
        result = {};
    }
    for(let key in obj){
        // 保证 key 不是原型上的属性
        if(obj.hasOwnProperty(key)){
            // 递归调用
            result[key] = deepClone(obj[key]);

        }
    }

    return result;

} 

//  类型转换
//  字符串拼接
var a = 100 + 10;   // 110
var b = 100 + '10'; // 10010
var c = true + '10'; // true100

//  == 运算符

100 == '100' ;      // true
0 == '';            // true
0 == false;         // true
false == '';        // true
null == undefined;  // true

// 除了null 之外都应用用 === 
var obj = { x:100 };
if(obj.a == null){}
// if(obj.a === null || obj.a=== undefined){}

//  if 语句与逻辑运算
// truly变量  !!a ==== true; 变量
// falsely 变量  !!a === false 变量
//  以下都是falsely变量
!!0 === false;
!!NaN === false;
!!'' === false;
!!null === false;
!!undefined === false;
!!false ===false;

//  if 语句判断的是truly变量or falsely变量
var a = 100;
if( a ){
    //
}

var c = '';
if( c ){
    // 
}

// 逻辑判断
console.log(10 && 0 ) // 0
console.log('' || 'abc') // abc
console.log(!window.abc) // true


/* 
1. typeof 能判断哪些类型
识别所用的值类型
识别 函数
判断是否为引用类型（不可细分）

2. 什么时候用 ==  什么时候用 ===
除了==null 之外都应该用 ===

3. 值类型与引用类型区别
a.值类型 key 和 value 都存储带 栈中
b. 引用类型  key存储在栈中 v 在栈中存储的是内存地址  真真的值存储在堆中
c. 修改值，引用这个值地址的变量都会发生改变

4. 手写深拷贝 
*/






</script>
</body>
</html>